home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Languguage OS 2
/
Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO
/
language
/
ici
/
ici.cpi
/
mem.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-10-27
|
2KB
|
140 lines
#include "mem.h"
#include "int.h"
#include "buf.h"
STATIC long
mark_mem(o)
object_t *o;
{
o->o_flags |= O_MARK;
return sizeof(mem_t);
}
STATIC int
cmp_mem(m1, m2)
mem_t *m1;
mem_t *m2;
{
return m1->m_base != m2->m_base
|| m1->m_length != m2->m_length
|| m1->m_accessz != m2->m_accessz
|| m1->m_free != m2->m_free;
}
STATIC long
hash_mem(m)
mem_t *m;
{
return (long)m->m_base + (long)m->m_length + (long)m->m_accessz;
}
STATIC int
assign_mem(m, k, v)
register mem_t *m;
object_t *k;
object_t *v;
{
register int i;
if (!isint(k) || !isint(v))
return assign_simple(objof(m), k, v);
i = intof(k)->i_value;
if (i < 0 || i >= m->m_length)
{
sprintf(buf, "attempt to write at mem index %d\n", i);
error = buf;
return 1;
}
switch (m->m_accessz)
{
case 1:
m->m_base[i] = intof(v)->i_value;
break;
case 2:
((short *)m->m_base)[i] = intof(v)->i_value;
break;
case 4:
((long *)m->m_base)[i] = intof(v)->i_value;
break;
}
return 0;
}
STATIC object_t *
fetch_mem(m, k)
register mem_t *m;
object_t *k;
{
register long i;
register object_t *o;
if (!isint(k))
return fetch_simple(objof(m), k);
i = intof(k)->i_value;
if (i < 0 || i >= m->m_length)
return objof(&o_null);
switch (m->m_accessz)
{
case 1:
i = ((unsigned char *)m->m_base)[i];
break;
case 2:
i = ((unsigned short *)m->m_base)[i];
break;
case 4:
i = ((long *)m->m_base)[i];
break;
}
o = objof(new_int(i));
loose(o);
return o;
}
mem_t *
new_mem(base, length, accessz, free_func)
char *base;
unsigned long length;
int accessz;
void (*free_func)();
{
register mem_t *m;
if ((m = talloc(mem_t)) == NULL)
return NULL;
objof(m)->o_type = &mem_type;
objof(m)->o_tcode = TC_OTHER;
objof(m)->o_flags = 0;
objof(m)->o_nrefs = 1;
rego(m);
m->m_base = base;
m->m_length = length;
m->m_accessz = accessz;
m->m_free = free_func;
return memof(atom(objof(m), 1));
}
STATIC void
free_mem(m)
register mem_t *m;
{
if (m->m_free != NULL)
(*m->m_free)(m->m_base);
zfree((char *)m);
}
type_t mem_type =
{
mark_mem,
free_mem,
hash_mem,
cmp_mem,
copy_simple,
assign_mem,
fetch_mem,
"mem"
};